﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistence;
using Model;


namespace Service
{
    public class GerenciadorServico
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorServico()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorServico(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="servico">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(ServicoModel servico)
        {
            tb_servico servicoE = new tb_servico();
            Atribuir(servico, servicoE);
            unitOfWork.RepositorioServico.Inserir(servicoE);
            unitOfWork.Commit(shared);
            return servicoE.id_servico;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Editar(ServicoModel servico)
        {
            tb_servico servicoE = new tb_servico();
            Atribuir(servico, servicoE);
            unitOfWork.RepositorioServico.Editar(servicoE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Remover(int IDServico)
        {
            unitOfWork.RepositorioServico.Remover(servicoE => servicoE.id_especialidade.Equals(IDServico));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do Serviço como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<ServicoModel> GetQuery()
        {
            IQueryable<tb_servico> tb_servico = unitOfWork.RepositorioServico.GetQueryable();
            var query = from servicoE in tb_servico
                        select new ServicoModel
                        {
                            IDscodigo = servicoE.id_servico,
                            snome = servicoE.servico_nome,
                            sdescricao = servicoE.servico_descricao,
                            IDsespecialidade = servicoE.id_especialidade

                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ServicoModel> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um Serviço
        /// </summary>
        /// <param name="id_servico">Identificador do serviço na base de dados</param>
        /// <returns>ServicoModel</returns>
        public ServicoModel Obter(int IDServico)
        {
            IEnumerable<ServicoModel> servico = GetQuery().Where(ServicoModel => ServicoModel.IDscodigo.Equals(IDServico));
            return servico.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do ServicoModel para o Servico Entity
        /// </summary>
        /// <param name="servico">Objeto do modelo</param>
        /// <param name="serE">Entity mapeada da base de dados</param>
        private void Atribuir(ServicoModel servico, tb_servico servicoE)
        {
            servicoE.id_servico = servico.IDscodigo;
            servicoE.servico_nome = servico.snome;
            servicoE.servico_descricao = servico.sdescricao;
            servicoE.id_especialidade = servico.IDsespecialidade;

        }
    }
}

